#include "../../include/LRUCache.hh"

//构造函数
LRUCache::LRUCache(int num)
:_capacity(num)
,_Head(new LNode("", ""))
,_Rear(new LNode("", ""))
{
    //头尾节点初始化
    _Head->next = _Rear;
    _Rear->front = _Head;
}

//拷贝构造
LRUCache::LRUCache(const LRUCache &cache)
:_capacity(cache._capacity)
,_Head(cache._Head)
,_Rear(cache._Rear){}

//往双向链表中插入新的节点
void LRUCache::insert(LRUCache::LNode* p)
{
    p->next = _Head->next;
    p->front = _Head;
    _Head->next->front = p;
    _Head->next = p;
}

//从双向链表中删除一个节点
void LRUCache::remove(LRUCache::LNode* p)
{
    p->next->front = p->front;
    p->front->next = p->next;
}

//往缓存中添加或者更新数据
void LRUCache::addElement(const string &key, const string &value)
{
    //缓存中没有则添加
    if(_hashMap.count(key) == 0)
    {
        //缓存满了先删除尾部的再添加
        if(_hashMap.size() == _capacity)
        {
            auto p = _Rear->front;
            remove(p);
            _hashMap.erase(p->key);
            delete p;
        }
        //缓存未满直接添加
        auto p = new LNode(key, value);
        _hashMap[key] = p;
        insert(p);
    }
    else  //缓存中有则更新其value，再把其移到队头
    {
        auto p = _hashMap[key];
        p->value = value;
        remove(p);
        insert(p);
    }
}

//从文件中读取缓存信息
void LRUCache::readFromFile(const string &filename)
{
    
}

//将缓存信息写入到文件中
void LRUCache::writeToFile(const string &filename)
{

}

//更新缓存信息
void LRUCache::update(const LRUCache &rhs)
{

}

//获取待更新的节点List
LRUCache::LNode* LRUCache::getPendingUpdateList()
{

}
